import pymysql
from movie_dao import MovieDAO
import logging
import re

# 配置日志
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')
logger = logging.getLogger(__name__)

def clean_country(raw_country):
    """
    数据清洗：处理电影国家/地区信息，统一格式
    功能：
    1. 处理多国家情况，只保留第一个国家
    2. 统一中国相关地区的名称
    3. 去除空格和特殊字符
    4. 处理空值情况
    
    示例：
    - '中国大陆 中国香港' -> '中国大陆'
    - '美国/英国' -> '美国'
    - '中国香港' -> '中国大陆'
    - '中国台湾' -> '中国大陆'
    - '' -> None
    
    :param raw_country: 原始国家/地区字符串，可能包含多个国家或特殊字符
    :return: 清洗后的标准国家名称，如果输入为空则返回None
    """
    if not raw_country:
        return None
    
    # 使用正则表达式分割字符串，处理多种分隔符情况
    # 分隔符包括：空格、斜杠、中文逗号、顿号、英文逗号
    # 取第一个元素作为主要国家
    country = re.split(r'[ /，、,]', raw_country.strip())[0]
    
    # 特殊处理中国相关地区，统一归为中国大陆
    if country in ['中国香港', '中国台湾']:
        return '中国大陆'
    
    return country

class CountryStatsDAO:
    """
    国家统计数据访问对象
    功能：
    1. 统计各国电影数量
    2. 计算各国电影平均评分
    3. 找出各国评分最高的电影作为代表作
    4. 过滤掉电影数量较少的国家
    """
    
    def __init__(self):
        """初始化国家统计DAO对象，复用MovieDAO的数据库配置"""
        self.movie_dao = MovieDAO()

    def get_country_stats(self):
        """
        获取各国家电影统计数据，包括数量、平均评分和代表作
        处理流程：
        1. 从数据库获取原始电影数据
        2. 清洗国家名称
        3. 统计各国电影数量和评分
        4. 找出各国代表作
        5. 过滤并格式化最终结果
        
        :return: 包含各国统计信息的列表，每个元素包含：
                - country: 国家名称
                - count: 电影数量
                - avg_rating: 平均评分
                - top_movies: 代表作列表（评分最高的电影）
        """
        conn = None
        cursor = None
        try:
            conn = self.movie_dao.get_connection()
            cursor = conn.cursor(pymysql.cursors.DictCursor)
            
            # SQL查询：获取所有电影的基本信息
            sql = """
                SELECT
                    country,
                    title,
                    rating,
                    year
                FROM movies
                WHERE country IS NOT NULL AND country != ''
                  AND rating IS NOT NULL AND rating != ''
            """
            cursor.execute(sql)
            movies = cursor.fetchall()
            logger.info(f"原始电影数据: {movies[:5]} ... 共{len(movies)}条")

            # 数据清洗与聚合
            country_dict = {}
            for row in movies:
                country = clean_country(row['country'])
                if not country:
                    continue
                rating = float(row['rating'])
                
                # 初始化国家统计信息
                if country not in country_dict:
                    country_dict[country] = {
                        'count': 0,
                        'rating_sum': 0.0,
                        'rating_count': 0,
                        'top_movie': None
                    }
                
                # 更新统计信息
                country_dict[country]['count'] += 1
                country_dict[country]['rating_sum'] += rating
                country_dict[country]['rating_count'] += 1
                
                # 更新代表作：保留评分最高的电影
                if (country_dict[country]['top_movie'] is None or
                    rating > country_dict[country]['top_movie']['rating']):
                    country_dict[country]['top_movie'] = {
                        'title': row['title'],
                        'rating': rating,
                        'year': str(row['year'])
                    }

            # 组装最终数据
            country_stats = []
            for country, info in country_dict.items():
                # 只保留电影数量大于10的国家
                if info['count'] > 10:
                    avg_rating = round(info['rating_sum'] / info['rating_count'], 2) if info['rating_count'] else 0
                    country_stats.append({
                        'country': country,
                        'count': info['count'],
                        'avg_rating': avg_rating,
                        'top_movies': [info['top_movie']] if info['top_movie'] else []
                    })

            logger.info(f"最终返回的国家统计数据: {country_stats[:5]} ... 共{len(country_stats)}个国家")
            return country_stats

        except Exception as e:
            logger.error(f"获取国家统计数据时出错: {str(e)}")
            logger.exception("详细错误信息:")
            return []
        finally:
            if cursor:
                cursor.close()
            if conn:
                conn.close()